package me.flamboo.graves;

import com.gmail.filoghost.holograms.api.FloatingItem;
import com.gmail.filoghost.holograms.api.Hologram;
import com.gmail.filoghost.holograms.api.HolographicDisplaysAPI;

import java.awt.SystemColor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Logger;

import me.flamboo.gravescmd.GravesCookies;
import me.flamboo.gravescmd.GravesHelp;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.FileConfigurationOptions;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class Graves extends JavaPlugin
implements Listener
{
	public final Logger logger = Logger.getLogger("Minecraft");
	  private HashMap<Player, ItemStack[]> inventory = new HashMap();
	  private HashMap<Player, ItemStack[]> armor = new HashMap();
	  private HashMap<Player, Integer> xp = new HashMap();
	  private HashMap<Player, List<ItemStack>> drops = new HashMap();
	  private boolean oneRecovery;
	  private String success;
	  private String fail;
	  private boolean drop;
	  private boolean saveEmpty;
	  FileConfiguration config;
public void onEnable()

{
	if(this.getConfig().getBoolean("Secret-Cookies") == true)
	  {
		System.out.println(ChatColor.DARK_GRAY + "" + ChatColor.BOLD + "[" + ChatColor.AQUA + "Graves" + ChatColor.DARK_GRAY.BOLD + "]" + ChatColor.AQUA + " Activating Secret Cookies!!");
		getCommand("GS").setExecutor(new GravesCookies());
	  }
	else
	{
		
	  }
	
  getCommand("Graves").setExecutor(new GravesHelp());

  PluginManager pm = getServer().getPluginManager();
  pm.registerEvents(this, this);

  FileConfiguration config = getConfig();

  config.addDefault("Graves.Known-Player.Stats", true);
  config.addDefault("Graves.Known-Player.LifeSpan", 1500);
//  config.addDefault("Graves.Known-Player.Color", "Aqua");
//  config.addDefault("Graves.Known-Player.Hight", 5);
  config.addDefault("Graves.Known-Player.Item", "CHEST");
//  config.addDefault("Graves.Known-Player.ItemHight", 2);
  config.addDefault("Graves.Unknown-Player.Use", true);
  config.addDefault("Graves.Unknown-Player.LifeSpan", 1500);
//  config.addDefault("Graves.Unknown-Player.Color", "Aqua");
//  config.addDefault("Graves.Unknown-Player.Hight", 5);
  config.addDefault("Graves.Unknown-Player.Item", "ROTTEN_FLESH");
//  config.addDefault("Graves.Unknown-Player.ItemHight", 2);
//  config.addDefault("Graves.Unknown-Player.Message", "some one was killed here Dont know who though?");
  config.addDefault("Permission.Reload", "GR");
//  config.addDefault("Permission.Graves", "Use");
  config.addDefault("Secret-Cookies", true);
  
  config.options().copyDefaults(true);
  saveConfig();

  for (Hologram localHologram : HolographicDisplaysAPI.getHolograms(this));
}

 


public boolean onCommand(CommandSender sender, Command cmd, String commandLable, String[] args)
{
  Player player = (Player)sender;
  if (player.hasPermission(getConfig().getString("Permission.Reload"))) {
    if (commandLable.equalsIgnoreCase("GR")) {
      reloadConfig();
      player.sendMessage(ChatColor.AQUA + "Reloading Config......");
      player.sendMessage(ChatColor.AQUA + "Config Reloaded");
    }
    else
    {
      player.sendMessage(ChatColor.DARK_RED + "You Are Not allowed to that Silly");
    }
  }
  return false;
}



public void saveStack(Player p, String where, YamlConfiguration yaml){
List<ItemStack> stack = new ArrayList<ItemStack>();
for (ItemStack i : p.getInventory().getContents()){
if (i != null && !i.getType().equals(Material.AIR)){
stack.add(i);
}
}
yaml.set(where, stack);
}

@EventHandler
public void onPlayerDeath(PlayerDeathEvent e)
{
  if (e.getEntity().hasPermission(getConfig().getString("Permission.Graves"))) 
  {
  if(this.getConfig().getBoolean("Graves.Known-Player.Stats") == true)
  {
	Calendar c = Calendar.getInstance();
	Location loc = e.getEntity().getLocation().add(0.0D, 2.0D, 0.0D);
    ItemStack itemStack = new ItemStack(Material.getMaterial(getConfig().getString("Graves.Known-Player.Item")));
	final FloatingItem floatingItem = HolographicDisplaysAPI.createFloatingItem(this, loc, itemStack);
   
	final Hologram h = HolographicDisplaysAPI.createHologram(this, 
      e.getEntity().getLocation().add(0.0D, 5.0D, 0.0D), new String[] { 
              ChatColor.AQUA + e.getEntity().getDisplayName(), 
    	      ChatColor.AQUA + "Was Killed Here", 
    	      ChatColor.AQUA + "-=-=-=-=-=-=-=-=-=-=-",
    	      ChatColor.AQUA + "Level: " + e.getEntity().getLevel(), 
    	      ChatColor.AQUA + "Time of death: " + c.get(10) + ":" + c.get(12) + (c.get(9) == 0 ? " AM" : " PM"),
    	      ChatColor.AQUA + "Killer: " + e.getEntity().getKiller().getDisplayName(),
    	      ChatColor.AQUA + "-=-=-=-=-=-=-=-=-=-=-"});
//      saveInv(e.getEntity(), e.getDrops());
    new BukkitRunnable()
    {
      public void run()
      {
        h.delete();
        floatingItem.delete();
      }
    }
    .runTaskLater(this, (Long)getConfig().getLong("Graves.Known-Player.LifeSpan"));
  }
  else 
  { 
	  Calendar c = Calendar.getInstance();
	  Location loc = e.getEntity().getLocation().add(0.0D, 2.0D, 0.0D);
	  ItemStack itemStack = new ItemStack(Material.getMaterial(getConfig().getString("Graves.Known-Player.Item")));
	  final FloatingItem floatingItem = HolographicDisplaysAPI.createFloatingItem(this, loc, itemStack);
	 
	  final Hologram h = HolographicDisplaysAPI.createHologram(this, 
		      e.getEntity().getLocation().add(0.0D, 5.0D, 0.0D), new String[] { 
	                  ChatColor.AQUA + "" + ChatColor.BOLD + "-=-=-=-=-=-=-=-=-=-=-",
		              ChatColor.AQUA + e.getEntity().getDisplayName(), 
		    	      ChatColor.AQUA + "Was Killed Here", 
		    	      ChatColor.AQUA + "" + ChatColor.BOLD + "-=-=-=-=-=-=-=-=-=-=-"});
//		      saveInv(e.getEntity(), e.getDrops());
		    new BukkitRunnable()
		    {
		      public void run()
		      {
		        h.delete();
		        floatingItem.delete();
		      }
		    }
		    .runTaskLater(this, (Long)getConfig().getLong("Graves.Known-Player.LifeSpan"));
  }
  }
  else
	  if(this.getConfig().getBoolean("Graves.Unknown-Player.Use") == true)
  {

	  Location loc = e.getEntity().getLocation().add(0.0D, 2.0D, 0.0D);
	  ItemStack itemStack = new ItemStack(Material.getMaterial(getConfig().getString("Graves.Unknown-Player.Item")));
	  final FloatingItem floatingItem = HolographicDisplaysAPI.createFloatingItem(this, loc, itemStack);
	  

    final Hologram h = HolographicDisplaysAPI.createHologram(this, 
      e.getEntity().getLocation().add(0.0D, 5.0D, 0.0D), new String[] { 
      ChatColor.AQUA + "some one was killed here Dont know who though?" });

    new BukkitRunnable()
    {
      public void run() 
      {
        h.delete();
        floatingItem.delete();
      }
    }
    .runTaskLater(this, (Long)getConfig().getLong("Graves.Unknown-Player.LifeSpan"));
    }
  
}
  


	  
}
/*
protected void saveInv(Player player, List<ItemStack> drops)
{
  if ((this.saveEmpty) || 
    (!isItemStackArrayEmpty(player.getInventory().getContents())) || 
    (!isItemStackArrayEmpty(player.getInventory()
    .getArmorContents()))) {
    this.inventory.put(player, player.getInventory().getContents());
    this.armor.put(player, player.getInventory().getArmorContents());
    this.xp.put(player, Integer.valueOf(player.getTotalExperience()));
    if (this.drop)
      this.drops.put(player, drops);
    else
      drops.clear();
  }
}

private boolean isItemStackArrayEmpty(ItemStack[] items)
{
  for (ItemStack item : items) {
    if (item != null) {
      return false;
    }
  }
  return true;
}

private boolean recover(Player player) {
  int r = 0;
  if (this.inventory.containsKey(player)) {
    player.getInventory().setContents(
      copyItems((ItemStack[])this.inventory.get(player)));
    if (this.oneRecovery) {
      this.inventory.remove(player);
    }
    r++;
  }
  if (this.armor.containsKey(player)) {
    player.getInventory().setArmorContents(
      copyItems((ItemStack[])this.armor.get(player)));
    if (this.oneRecovery) {
      this.armor.remove(player);
    }
    r++;
  }
  if (this.xp.containsKey(player)) {
    player.setTotalExperience(((Integer)this.xp.get(player))
      .intValue());
    if (this.oneRecovery) {
      this.xp.remove(player);
    }
  }
  if (r > 0)
    player.sendMessage(this.success);
  else {
    player.sendMessage(this.fail);
  }
  return r > 0;
}

private ItemStack[] copyItems(ItemStack[] original) {
  ItemStack[] result = new ItemStack[original.length];
  for (int i = 0; i < result.length; i++) {
    if (original[i] != null) {
      result[i] = new ItemStack(original[i]);
    }
  }
  return result;
}

*/





